package PracticasPL.Practica2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Stack;

/**
 * Hello world!
 *
 */
public class App 
{
	private static CjtoSimbolos cjtoSimb;
	private static CjtoPalabrasReservadas cjtoPalRes;
	private static final char BLOQUE_ABRIR = '{';
	private static final char BLOQUE_CERRAR = '}';
	
	public static void anaLex(String filename)
	{
		try {
			FileReader f = new FileReader(filename);
			BufferedReader br = new BufferedReader(f);
			
			String linea = null;
			int lineCount = 1;
			int prof = 0;
			
			ListaPalReservadas lista = new ListaPalReservadas();
			Stack<Integer> bloques = new Stack<Integer>();
			
			ArrayList<Integer> bloqLineas = new ArrayList<Integer>();
			ArrayList<Integer> profundidad = new ArrayList<Integer>();
			
			while((linea = br.readLine()) != null)
			{
				char c;
				String palabra = "";
				for(int i = 0; i < linea.length(); i++)
				{
					c = linea.charAt(i);
					if(!cjtoSimb.contiene(c))
					{
						System.out.println("El caracter " +c+" no pertenece al conjunto de simbolos");
						f.close();
						br.close();
						return;
						
					}
					if(c == BLOQUE_ABRIR)
					{
						bloques.push(new Integer(lineCount));
						prof++;
					}
					else if (c == BLOQUE_CERRAR)
					{
						if(!bloques.empty())
						{
							Integer aux = bloques.pop();
							bloqLineas.add(aux);
							bloqLineas.add(lineCount);
							profundidad.add(new Integer(prof));
							prof--;
						}
						else
						{
							System.out.println("El archivo está mal formateado");
							f.close();
							br.close();
							return;
						}
					}
					if(Character.isLetter(c) || Character.isDigit(c))
					{
						palabra = palabra + c;
					}
					else
					{
						if((palabra != "") && (cjtoPalRes.contiene(palabra)))
						{
							lista.add(palabra, lineCount);
							
						}
						palabra = "";
					}
					
				}
				if((palabra != "") && (cjtoPalRes.contiene(palabra)))
				{
					lista.add(palabra, lineCount);
					
				}
				palabra = "";
				lineCount++;
			}
			
			f.close();
			br.close();
			
			if(!bloques.empty())
			{
				System.out.println("El archivo está mal formateado");
				return;
			}
			
			System.out.println("\n"+lista.toString());
			System.out.println("Bloques de codigo encontrados: ");
			for(int i = 0; i < bloqLineas.size(); i = i + 2)
			{
				int profbloq = 0;
				/*if(i == 0)
					profbloq = profundidad.get(i);
				else
					profbloq = profundidad.get(i-1);*/
				System.out.println("Bloque " + i / 2 +" en lineas "+bloqLineas.get(i)+ " y " +bloqLineas.get(i + 1) + " nivel: "+ profundidad.get(i/2));
			}
			
			System.out.println("\nAnálisis léxico terminado");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
    public static void main( String[] args )
    {
    	if(args.length < 3)
    	{
    		System.out.println("Error, faltan argumentos");
    		return;
    	}
    	cjtoSimb = new CjtoSimbolos(args[0]);
    	System.out.println(cjtoSimb.toString());
    	cjtoPalRes = new CjtoPalabrasReservadas(args[1]);
    	System.out.println(cjtoPalRes.toString());
    	anaLex(args[2]);
    }
}
